// 缓存名称和版本
const CACHE_NAME = 'bhhs-cache-v1';

// 需要缓存的静态资源
const urlsToCache = [
  '/',
  '/index.html',
  '/favicon.ico',
  '/static/css/',
  '/static/js/',
  '/static/img/'
];

// 安装Service Worker时缓存静态资源
self.addEventListener('install', event => {
  event.waitUntil(
    caches.open(CACHE_NAME)
      .then(cache => {
        console.log('Service Worker: 缓存静态资源');
        return cache.addAll(urlsToCache);
      })
  );
});

// 拦截请求并优先使用缓存
self.addEventListener('fetch', event => {
  // 检查请求的 URL 协议，只处理 http 和 https 请求
  if (!event.request.url.startsWith('http')) {
    return; // 不处理非http/https请求，包括chrome-extension请求
  }
  
  event.respondWith(
    caches.match(event.request)
      .then(response => {
        // 如果找到缓存的响应，返回缓存
        if (response) {
          return response;
        }
        
        // 否则发起网络请求
        return fetch(event.request)
          .then(networkResponse => {
            // 检查是否收到有效响应
            if (!networkResponse || networkResponse.status !== 200 || networkResponse.type !== 'basic') {
              return networkResponse;
            }
            
            // 克隆响应，因为响应是流，只能使用一次
            const responseToCache = networkResponse.clone();
            
            // 将新响应添加到缓存
            caches.open(CACHE_NAME)
              .then(cache => {
                try {
                  // 确保 URL 协议是 http 或 https
                  if (event.request.url.startsWith('http')) {
                    cache.put(event.request, responseToCache);
                  }
                } catch (error) {
                  console.error('缓存请求失败:', error, event.request.url);
                }
              });
            
            return networkResponse;
          });
      })
  );
});

// 激活时清除旧缓存
self.addEventListener('activate', event => {
  const cacheWhitelist = [CACHE_NAME];
  
  event.waitUntil(
    caches.keys().then(cacheNames => {
      return Promise.all(
        cacheNames.map(cacheName => {
          if (cacheWhitelist.indexOf(cacheName) === -1) {
            // 删除不在白名单中的缓存
            return caches.delete(cacheName);
          }
        })
      );
    })
  );
}); 